#include <stdarg.h>
#include "hw.h"
#include "uart.h"


/* UART 初始化函数 */
void uart_init(void)
{
    /* 1. 先禁用 UART */
    UARTCR = 0x0;
    
    /* 2. 设置波特率为 115200 */
    /* 假设时钟频率 24MHz: 24000000/(16*115200) = 13.02 */
    UARTIBRD = 13;  /* 整数部分 */
    UARTFBRD = 1;   /* 小数部分 */
    
    /* 3. 设置线路控制 */
    /* 8位数据, 无奇偶校验, 1位停止位, FIFO使能 */
    UARTLCR_H = 0x70;  /* WLEN=8 (0x60), FIFO使能 (0x10) */
    
    /* 4. 清除所有中断 */
    UARTICR = 0x7FF;
    
    /* 5. 使能 UART */
    /* 发送使能, 接收使能, UART使能 */
    UARTCR = 0x301;  /* TXE=1, RXE=1, UARTEN=1 */
}

/* 发送一个字符 */
int uart_putc(int c)
{
    /* 等待发送 FIFO 不满 */
    while (UARTFR & UARTFR_TXFF);
    
    /* 发送字符 */
    UARTDR = (char)c;

    return (int)c;
}

/* 接收一个字符 */
int uart_getc(void)
{
    /* 等待接收 FIFO 不空 */
    while (UARTFR & UARTFR_RXFE);
    
    /* 读取字符 */
    return (int)(UARTDR & 0xFF);
}
